home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / term / extras / source / gtlayout-source.lha / gtlayout_lib.c < prev    next >
C/C++ Source or Header  |  1995-05-27  |  5KB  |  255 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1995 by Olaf `Olsen' Barthel
  5. **    Freely distributable.
  6. */
  7.  
  8. #include "gtlayout_global.h"
  9.  
  10. struct GTLayoutBase
  11. {
  12.     struct Library         LibNode;
  13.  
  14.     struct ExecBase        *ExecBase;
  15.     struct SignalSemaphore     LockSemaphore;
  16.     BPTR             LibSegment;
  17. };
  18.  
  19. #ifdef __SASC
  20. #define SysBase GTLayoutBase -> ExecBase
  21. #endif    // __SASC
  22.  
  23. struct Library * __saveds __asm    LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase);
  24. struct Library * __saveds __asm    LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase);
  25. BPTR __saveds __asm        LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase);
  26. BPTR __saveds __asm        LibClose(register __a6 struct GTLayoutBase *GTLayoutBase);
  27. LONG __saveds __asm        LibNull(register __a6 struct GTLayoutBase *GTLayoutBase);
  28.  
  29. STATIC APTR LibVectors[] =
  30. {
  31.     LibOpen,
  32.     LibClose,
  33.     LibExpunge,
  34.     LibNull,
  35.  
  36.     LT_LevelWidth,
  37.     LT_DeleteHandle,
  38.     LT_CreateHandle,
  39.     LT_CreateHandleTagList,
  40.     LT_Rebuild,
  41.     LT_HandleInput,
  42.     LT_BeginRefresh,
  43.     LT_EndRefresh,
  44.     LT_GetAttributesA,
  45.     LT_SetAttributesA,
  46.     LT_AddA,
  47.     LT_NewA,
  48.     LT_EndGroup,
  49.     LT_LayoutA,
  50.     LT_LayoutMenusA,
  51. #ifdef DO_FRACTION_KIND
  52.     LT_Fixed2String,
  53.     LT_String2Fixed,
  54.     LT_FixedMult,
  55. #else
  56.     LibNull,
  57.     LibNull,
  58.     LibNull,
  59. #endif    // DO_FRACTION_KIND
  60.     LT_LabelWidth,
  61.     LT_LabelChars,
  62.     LT_LockWindow,
  63.     LT_UnlockWindow,
  64.     LT_DeleteWindowLock,
  65.     LT_ShowWindow,
  66.     LT_Activate,
  67.     LT_PressButton,
  68.     LT_GetCode,
  69.     LT_GetIMsg,
  70.     LT_ReplyIMsg,
  71.     LT_BuildA,
  72.     LT_RebuildTagList,
  73.     LT_UpdateStrings,
  74.  
  75. #ifdef DO_MENUS
  76.     LT_DisposeMenu,
  77.     LT_NewMenuTemplate,
  78.     LT_NewMenuTagList,
  79.     LT_MenuControlTagList,
  80.     LT_GetMenuItem,
  81.     LT_FindMenuCommand,
  82. #else
  83.     LibNull,
  84.     LibNull,
  85.     LibNull,
  86.     LibNull,
  87.     LibNull,
  88.     LibNull,
  89. #endif    // DO_MENUS
  90.  
  91.     LT_NewLevelWidth,
  92.  
  93.     (APTR)-1
  94. };
  95.  
  96. extern UBYTE __far    LibName[],
  97.             LibID[];
  98.  
  99. extern LONG __far    LibVersion,
  100.             LibRevision;
  101.  
  102. #ifdef __SASC
  103. struct { ULONG DataSize; APTR Table; APTR Data; struct Library * (*Init)(); } __aligned LibInitTab =
  104. {
  105.     sizeof(struct GTLayoutBase),
  106.     LibVectors,
  107.     NULL,
  108.     LibInit
  109. };
  110. #endif    // __SASC
  111.  
  112. #ifdef _DCC
  113. extern ULONG __stkargs __asm _AutoInit0(__a6 struct ExecBase *SysBase);
  114. extern ULONG __stkargs __asm _AutoInit1(__a6 struct ExecBase *SysBase);
  115.  
  116. extern ULONG __stkargs __asm _AutoExit0(__a6 struct ExecBase *SysBase);
  117. extern ULONG __stkargs __asm _AutoExit1(__a6 struct ExecBase *SysBase);
  118. #endif    // _DCC
  119.  
  120. struct Library * __saveds __asm
  121. LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase)
  122. {
  123. #ifdef _DCC
  124.     struct ExecBase *SysBase;
  125. #endif    // _DCC
  126.  
  127. #ifdef CPU_ANY
  128.     if(ExecBase -> LibNode . lib_Version < 37)
  129.         return(NULL);
  130. #else
  131.     if(ExecBase -> LibNode . lib_Version < 37 || !(ExecBase -> AttnFlags & AFF_68020))
  132.         return(NULL);
  133. #endif    // CPU_ANY
  134.  
  135. #ifdef _DCC
  136.     if(_AutoInit0(SysBase))
  137.         return(NULL);
  138.  
  139.     if(_AutoInit1(SysBase))
  140.         return(NULL);
  141.  
  142.     SysBase = ExecBase;
  143.  
  144.     if(!(GTLayoutBase = (struct GTLayoutBase *)MakeLibrary((APTR)LibVectors,NULL,NULL,sizeof(struct GTLayoutBase),NULL)))
  145.         return(NULL);
  146. #endif    // _DCC
  147.  
  148.     GTLayoutBase -> LibNode . lib_Node . ln_Type    = NT_LIBRARY;
  149.     GTLayoutBase -> LibNode . lib_Node . ln_Name    = LibName;
  150.     GTLayoutBase -> LibNode . lib_Flags        = LIBF_CHANGED | LIBF_SUMUSED;
  151.     GTLayoutBase -> LibNode . lib_Version        = LibVersion;
  152.     GTLayoutBase -> LibNode . lib_Revision        = LibRevision;
  153.     GTLayoutBase -> LibNode . lib_IdString        = (APTR)LibID;
  154.  
  155.     GTLayoutBase -> LibSegment    = Segment;
  156.     GTLayoutBase -> ExecBase    = ExecBase;
  157.  
  158.     InitSemaphore(>LayoutBase -> LockSemaphore);
  159.  
  160.     return(GTLayoutBase);
  161. }
  162.  
  163. struct Library * __saveds __asm
  164. LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase)
  165. {
  166. #ifdef _DCC
  167.     struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
  168. #endif    // _DCC
  169.  
  170.     GTLayoutBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
  171.  
  172.     GTLayoutBase -> LibNode . lib_OpenCnt++;
  173.  
  174.     ObtainSemaphore(>LayoutBase -> LockSemaphore);
  175.  
  176.     if(GTLayoutBase -> LibNode . lib_OpenCnt == 1)
  177.     {
  178.         if(!LT_Init())
  179.         {
  180.             LT_Exit();
  181.  
  182.             GTLayoutBase -> LibNode . lib_OpenCnt--;
  183.  
  184.             ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  185.  
  186.             return(NULL);
  187.         }
  188.     }
  189.  
  190.     ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  191.  
  192.     return(GTLayoutBase);
  193. }
  194.  
  195. BPTR __saveds __asm
  196. LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase)
  197. {
  198. #ifdef _DCC
  199.     struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
  200. #endif    // _DCC
  201.  
  202.     if(!GTLayoutBase -> LibNode . lib_OpenCnt && GTLayoutBase -> LibSegment)
  203.     {
  204.         BPTR TempSegment = GTLayoutBase -> LibSegment;
  205.  
  206.         Remove((struct Node *)GTLayoutBase);
  207.  
  208.         FreeMem((BYTE *)GTLayoutBase - GTLayoutBase -> LibNode . lib_NegSize,GTLayoutBase -> LibNode . lib_NegSize + GTLayoutBase -> LibNode . lib_PosSize);
  209.  
  210. #ifdef _DCC
  211.         _AutoExit0(SysBase);
  212.         _AutoExit1(SysBase);
  213. #endif    // _DCC
  214.  
  215.         return(TempSegment);
  216.     }
  217.     else
  218.     {
  219.         GTLayoutBase -> LibNode . lib_Flags |= LIBF_DELEXP;
  220.  
  221.         return(NULL);
  222.     }
  223. }
  224.  
  225. BPTR __saveds __asm
  226. LibClose(register __a6 struct GTLayoutBase *GTLayoutBase)
  227. {
  228. #ifdef _DCC
  229.     struct ExecBase *SysBase = GTLayoutBase -> ExecBase;
  230. #endif    // _DCC
  231.  
  232.     if(GTLayoutBase -> LibNode . lib_OpenCnt)
  233.         GTLayoutBase -> LibNode . lib_OpenCnt--;
  234.  
  235.     if(!GTLayoutBase -> LibNode . lib_OpenCnt)
  236.     {
  237.         ObtainSemaphore(>LayoutBase -> LockSemaphore);
  238.  
  239.         LT_Exit();
  240.  
  241.         ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  242.  
  243.         if(GTLayoutBase -> LibNode . lib_Flags & LIBF_DELEXP)
  244.             return(LibExpunge(GTLayoutBase));
  245.     }
  246.  
  247.     return(NULL);
  248. }
  249.  
  250. LONG __saveds __asm
  251. LibNull(register __a6 struct GTLayoutBase *GTLayoutBase)
  252. {
  253.     return(NULL);
  254. }
  255.